package top.lywivan.netty.handler.clinet;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;
import top.lywivan.netty.pojo.UserInfo;

/**
 * @author :lyw.ivan
 * @date :Created in 2022/8/14
 * @description : 发送业务数据的handler
 * @version: 1.0
 */
@Slf4j
public class ClientInboundHandler extends ChannelInboundHandlerAdapter {
    /**
     * 连接建立后，会调用该方法，这里直接批量发送消息
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        log.info("客户端完成连接建立，准备发送消息");
        UserInfo userInfo;
        for (int i = 0; i < 100; i++) {
            userInfo=new UserInfo(i,"name"+i,i+1,(i%2==0) ? "男":"女","北京");
            //发送100次消息
            ctx.writeAndFlush(userInfo);
        }
        super.channelActive(ctx);
    }

    /**
     * 读取到消息时，调用该方法
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        log.info("客户端读取到服务器发送的消息");
        UserInfo userInfo= (UserInfo) msg;
        log.info("客户端读取到消息内容：{}",userInfo);
        super.channelRead(ctx, msg);
    }

    /**
     * 读完消息时，调用该方法
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        log.info("客户端读取完了消息");
        super.channelReadComplete(ctx);
    }

    /**
     * RPC调用中发生异常，调用该方法
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        log.info("客户端检测到RPC调用异常");
        super.exceptionCaught(ctx, cause);
    }
}
